/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import model.pojo.Atividade;

public final class AtividadeDaoImpl implements AtividadeDao {

    private ArrayList<Atividade> listaAtividade = null;
    /*associacao da atividade <atividade/Turma>*/
    private ArrayList<Integer> listaTurma = null;
    private ArrayList<Integer> listaAtividadeTurma = null;

    public AtividadeDaoImpl() {
        try {
            this.listaAtividade = carregarAtividades();
            carregarAssocAtividade();
        } catch (IOException e) {
        }
    }

    @Override
    public void setAtividade(ArrayList<Atividade> atividades) {
        this.listaAtividade = atividades;
    }

    @Override
    public ArrayList<Atividade> getAtividade() {
        return this.listaAtividade;
    }

    @Override
    public boolean addAtividade(Atividade atividade) {
        if (listaAtividade.contains(atividade)) {
            return false;
        } else {
            atividade.setId(novoId());
            this.listaAtividade.add(atividade);
            return true;
        }
    }

    /**
     *
     * @param atividades
     * @throws IOException Lança exceção caso não consiga salvar atividade.
     */
    @Override
    public void salvarAtividade(ArrayList<Atividade> atividades) throws IOException {
        try (FileWriter writer = new FileWriter("Atividades.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            int i;
            for (i = 0; i < atividades.size(); i++) {
                writer.write(atividades.get(i).getId() + ";" + atividades.get(i).getTipo() + ";" + atividades.get(i).getNome()
                        + ";" + atividades.get(i).getData() + ";" + atividades.get(i).getValor() + "\n");
            }
        }
    }

    /**
     *
     * @return Retorna lista de atividade caso haja, caso não haja cria uma nova lista.
     * @throws IOException Lança exceção caso haja erro ao carregar lista de atividades.
     */
    @Override
    public ArrayList<Atividade> carregarAtividades() throws IOException {
        ArrayList<Atividade> list = new ArrayList<>();
        File file = new File("Atividades.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                Atividade atividade = new Atividade(Integer.parseInt(t[0]), t[1], t[2], t[3], Double.parseDouble(t[4]));
                list.add(atividade);
            }
        }
        return list;
    }

    @Override
    public Integer buscaIdDNomeIdTurma(String atividade, Integer idAtividade) {
        Integer i;
        for (i = 0; i < listaAtividade.size(); i++) {
            if (listaAtividade.get(i).getNome().equals(atividade)) {
                if (listaAtividade.get(i).getNome().equals(atividade)) {
                    return listaAtividade.get(i).getId();
                }
            }
        }
        return -1;
    }

    /**
     *
     * @param atividade 
     * @return Retorna true caso a atividade buscada seja a mesma do arquivo. Caso contrario retorna false.
     */
    @Override
    public boolean contains(Atividade atividade) {
        Integer i;
        for (i = 0; i < this.listaAtividade.size(); i++) {
            if ((listaAtividade.get(i).getNome().equals(atividade.getNome()))
                    && (listaAtividade.get(i).getTipo().equals(atividade.getTipo()))
                    && (listaAtividade.get(i).getData().equals(atividade.getData()))) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @return Retorna 0 se lista de atividades estiver vazia e o número do próximo ID caso já exista.
     */
    @Override
    public Integer novoId() {
        if (listaAtividade.isEmpty()) {
            return 0;
        }
        return listaAtividade.get(listaAtividade.size() - 1).getId() + 1;
    }

    /**
     *
     * @return Retorna 0 caso a lista de atividades esteja vazia, se não, retorna a o ID do último elemento.
     */
    @Override
    public Integer ultimoId() {
        if (listaAtividade.isEmpty()) {
            return 0;
        }
        return listaAtividade.get(listaAtividade.size() - 1).getId();
    }

    /**
     * ********Associacao turma Disciplina**********
     */
    @Override
    public boolean addAtividadeTurma(Atividade atividade, Integer idTurma) {
        if (listaAtividade.contains(atividade)) {
            return false;
        } else {
            this.listaAtividade.add(atividade);
            this.listaTurma.add(idTurma);
            this.listaAtividadeTurma.add(ultimoId());
            return true;
        }
    }

    @Override
    public void carregarAssocAtividade() throws IOException {
        this.listaAtividadeTurma = new ArrayList<>();
        this.listaTurma = new ArrayList<>();
        File file = new File("AtividadeTurma.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                this.listaAtividadeTurma.add(Integer.parseInt(t[0]));
                this.listaTurma.add(Integer.parseInt(t[1]));
            }
        }
    }

    @Override
    public void salvarAtividadeTurma() throws IOException {
        try (FileWriter writer = new FileWriter("AtividadeTurma.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            Integer i;
            for (i = 0; i < listaAtividadeTurma.size(); i++) {
                writer.write(listaAtividadeTurma.get(i) + ";" + listaTurma.get(i) + "\n");
            }
        }
    }

    @Override
    public ArrayList<Integer> getListaTurma() {
        return listaTurma;
    }

    @Override
    public ArrayList<Integer> getListaAtividadeTurma() {
        return listaAtividadeTurma;
    }

    @Override
    public void setListaTurma(ArrayList<Integer> listaTurma) {
        this.listaTurma = listaTurma;
    }

    @Override
    public void setListaAtividadeTurma(ArrayList<Integer> listaAtividadeTurma) {
        this.listaAtividadeTurma = listaAtividadeTurma;
    }
}